; GO64! TUTORIAL ON 3-D GRAPHICS ; PART 3: MATRIX ROTATION ; GO64! 3D-KURS ; TEIL 3: MATRIXROTATION VICBANK = %00000011; $0000-$4000 V = VICBANK($03*$4000;=$0000 SCREEN = $0400 CHARSET = $0800 XADDLOTB = $2000 XADDHITB = $2080 PIXELTAB = $2100 BASEZP = $02 POINTERS = $00+BASEZP ALPHALO = $02+BASEZP BETALO = $03+BASEZP GAMMALO = $04+BASEZP ALPHA = $05+BASEZP BETA = $06+BASEZP GAMMA = $07+BASEZP SINBUFL0 = $08+BASEZP SINBUFH0 = $09+BASEZP SINBUFL1 = $0A+BASEZP SINBUFH1 = $0B+BASEZP UNITXXLO = $0C+BASEZP UNITXXHI = $0D+BASEZP UNITXYLO = $0E+BASEZP UNITXYHI = $0F+BASEZP UNITXZLO = $10+BASEZP UNITXZHI = $11+BASEZP UNITYXLO = $12+BASEZP UNITYXHI = $13+BASEZP UNITYYLO = $14+BASEZP UNITYYHI = $15+BASEZP UNITYZLO = $16+BASEZP UNITYZHI = $17+BASEZP UNITZXLO = $18+BASEZP UNITZXHI = $19+BASEZP UNITZYLO = $1A+BASEZP UNITZYHI = $1B+BASEZP UNITZZLO = $1C+BASEZP UNITZZHI = $1D+BASEZP DIVIDEND = $1E+BASEZP DIVISOR = $20+BASEZP X2DCRDFR = $23+BASEZP Z2DCRDFR = $2B+BASEZP X2DCORDS = $33+BASEZP Y2DCORDS = $3B+BASEZP Z2DCORDS = $43+BASEZP OLDXCRDS = $4B+BASEZP OLDYCRDS = $53+BASEZP FOREGNDC = $01 BACKGNDC = $06 XPOS = $0C; CHAR MATRIX COORDINATES YPOS = $05; ZEICHENMATRIXKOORDINATEN ALPHAADD = $FFFF+1-($0200/3) BETAADD = $0700/3; ANGLE ADD VALUES GAMMAADD = $0300/3; WINKELADDITIONSWERTE NUMPOINT = $08 *= $4000 SEI LDA #$35 STA $01 LDA #RETURN;NMI STA $FFFB BIT $D011 BPL *-3 BIT $D011 BMI *-3 LDA #$00 STA $D011 LDA #BACKGNDC STA $D020 STA $D021 ; BUILD TABLES ; TABELLEN GENERIEREN LDA #CHARSET+V LDY #$00 .BYTE $24 MKXADDTB PLA STA XADDLOTB,Y PHA TXA STA XADDHITB,Y INY TYA AND #%00000111 BNE MKXADDTB+0 PLA CLC ADC #$80 BCC *+3 INX CPY #$80 BNE MKXADDTB+1 LDA #%10000000 LDX #$00 MAKPXLTB STA PIXELTAB,X TAY LSR A TYA ROR A INX BPL MAKPXLTB LDX #$00 LDA SINCOSLO+$00,X STA SINCOSLO+$0100,X LDA SINCOSHI+$00,X STA SINCOSHI+$0100,X INX BNE *-13 ; CLEAR CHARSET ; ZEICHENSATZ LOESCHEN LDA #CHARSET+V STA POINTERS+1 LDA #$00 LDX #$08 TAY CLEARCHR STA (POINTERS+0),Y INY BNE CLEARCHR INC POINTERS+1 DEX BNE CLEARCHR ; CLEAR SCREEN ; BILDSCHIRM LOESCHEN LDA #$00 TAX STA SCREEN+V+$00,X STA SCREEN+V+$0100,X STA SCREEN+V+$0200,X STA SCREEN+V+$0300,X INX BNE *-13 ; SET UP SCREEN MATRIX ; BILDSCHIRMMATRIX BILDEN CLC LDA #XPOS+(YPOS*$28)+SCREEN+V STA POINTERS+1 LDX #$00 SETUPSCR TXA LDY #$00 STA (POINTERS+0),Y ADC #$10 INY CPY #$10 BNE SETUPSCR+3 LDA #$27 ADC POINTERS+0 STA POINTERS+0 BCC *+4 INC POINTERS+1 INX CPX #$10 BNE SETUPSCR ; SET FOREGROUND COLOUR ; VORDERGRUNDFARBE SETZEN LDA #FOREGNDC LDX #$00 STA $D800,X STA $D900,X STA $DA00,X STA $DB00,X INX BNE *-13 ; SET VIC REGISTERS ; VIC-REGISTER SETZEN BIT $D011 BPL *-3 BIT $D011 BMI *-3 LDA #%00011011 STA $D011 LDA #%00001000 STA $D016 LDA #SCREEN/$40.(CHARSET/$0400) STA $D018 LDA $DD00 AND #%00000011 ORA #VICBANK STA $DD00 ; RESET ANGLES AND COORDINATES ; KOORDINATEN&WINKEL NULLSETZEN LDA #$00 LDX #NUMPOINT-1 STA OLDXCRDS,X STA OLDYCRDS,X DEX BPL *-5 STA ALPHALO STA BETALO STA GAMMALO STA ALPHA STA BETA STA GAMMA ; MAIN LOOP ; HAUPTSCHLEIFE MAINLOOP ; ROTATE UNIT VECTORS ; (ABSOLUTELY UNOPTIMIZED) ; EINHEITSVEKTOREN ROTIEREN ; (ABSOLUT UNOPTIMIERT) ; COS (BETA) * COS (GAMMA) CLC LDA BETA ADC #$40 ; (COS) SEC SBC GAMMA SEC SBC #$40 ; (COS) TAX ; BETA-GAMMA CLC LDA BETA ADC #$40 ; (COS) CLC ADC GAMMA CLC ADC #$40 ; (COS) TAY ; BETA+GAMMA SEC LDA SINCOSLO+$40,X SBC SINCOSLO+$40,Y STA UNITXXLO LDA SINCOSHI+$40,X; COS(B-G) SBC SINCOSHI+$40,Y; - COS(B+G) STA UNITXXHI ; - SIN(A) * SIN(B) * COS(G) ; - COS(A) * SIN(G) CLC LDA BETA ADC GAMMA CLC ADC #$40 ; (COS) SEC SBC ALPHA SEC SBC #$80 ; (-) TAX ; BETA+GAMMA-ALPHA CLC LDA ALPHA ADC #$80 ; (-) CLC ADC GAMMA CLC ADC #$40 ; (COS) SEC SBC BETA TAY ; ALPHA+GAMMA-BETA CLC LDA SINCOSLO+$00,X ADC SINCOSLO+$00,Y STA SINBUFL0 LDA SINCOSHI+$00,X; SIN(B+G-A) ADC SINCOSHI+$00,Y;+ SIN(A+G-B) STA SINBUFH0 CLC LDA ALPHA ADC #$80 ; (-) CLC ADC BETA SEC SBC GAMMA SEC SBC #$40 ; (COS) TAX ; ALPHA+BETA-GAMMA CLC LDA ALPHA ADC #$80 ; (-) CLC ADC BETA CLC ADC GAMMA CLC ADC #$40 ; (COS) TAY ; ALPHA+BETA+GAMMA SEC LDA SINCOSLO+$00,X SBC SINCOSLO+$00,Y STA SINBUFL1 LDA SINCOSHI+$00,X; SIN(A+B-G) SBC SINCOSHI+$00,Y;- SIN(A+B+G) STA SINBUFH1 CLC LDA SINBUFL0 ADC SINBUFL1 STA SINBUFL1 LDA SINBUFH0 ADC SINBUFH1 CMP #$80 ROR A ; - SIN(A)*SIN(B)*COS(G) ROR SINBUFL1 STA SINBUFH1 CLC LDA ALPHA ADC #$40+$80 ; (-COS) SEC SBC GAMMA TAX ; ALPHA-GAMMA CLC LDA ALPHA ADC #$40+$80 ; (-COS) CLC ADC GAMMA TAY ; ALPHA+GAMMA SEC LDA SINCOSLO+$40,X SBC SINCOSLO+$40,Y STA SINBUFL0 ; COS(A-G) LDA SINCOSHI+$40,X; - COS(A+G) SBC SINCOSHI+$40,Y STA SINBUFH0 ; - COS(A)*SIN(G) CLC LDA SINBUFL0 ADC SINBUFL1 STA UNITXYLO LDA SINBUFH0 ADC SINBUFH1 STA UNITXYHI ; COS(A) * SIN(B) * COS(G) ; - SIN(A) * SIN(G) CLC LDA BETA ADC GAMMA CLC ADC #$40 ; (COS) SEC SBC ALPHA SEC SBC #$40 ; (COS) TAX ; BETA+GAMMA-ALPHA CLC LDA ALPHA ADC #$40 ; (COS) CLC ADC GAMMA CLC ADC #$40 ; (COS) SEC SBC BETA TAY ; ALPHA+GAMMA-BETA CLC LDA SINCOSLO+$00,X ADC SINCOSLO+$00,Y STA SINBUFL0 LDA SINCOSHI+$00,X; SIN(B+G-A) ADC SINCOSHI+$00,Y;+ SIN(A+G-B) STA SINBUFH0 CLC LDA ALPHA ADC #$40 ; (COS) CLC ADC BETA SEC SBC GAMMA SEC SBC #$40 ; (COS) TAX ; ALPHA+BETA-GAMMA CLC LDA ALPHA ADC #$40 ; (COS) CLC ADC BETA CLC ADC GAMMA CLC ADC #$40 ; (COS) TAY ; ALPHA+BETA+GAMMA SEC LDA SINCOSLO+$00,X SBC SINCOSLO+$00,Y STA SINBUFL1 LDA SINCOSHI+$00,X; SIN(A+B-G) SBC SINCOSHI+$00,Y;- SIN(A+B+G) STA SINBUFH1 CLC LDA SINBUFL0 ADC SINBUFL1 STA SINBUFL1 LDA SINBUFH0 ADC SINBUFH1 CMP #$80 ROR A ; COS(A)*SIN(B)*COS(G) ROR SINBUFL1 STA SINBUFH1 CLC LDA ALPHA ADC #$80 ; (-) SEC SBC GAMMA TAX ; ALPHA-GAMMA CLC LDA ALPHA ADC #$80 ; (-) CLC ADC GAMMA TAY ; ALPHA+GAMMA SEC LDA SINCOSLO+$40,X SBC SINCOSLO+$40,Y STA SINBUFL0 ; COS(A-G) LDA SINCOSHI+$40,X; - COS(A+G) SBC SINCOSHI+$40,Y STA SINBUFH0 ; - SIN(A)*SIN(G) CLC LDA SINBUFL0 ADC SINBUFL1 STA UNITXZLO LDA SINBUFH0 ADC SINBUFH1 STA UNITXZHI ; - COS (BETA) * SIN (GAMMA) CLC LDA BETA ADC #$40+$80 ; (-COS) SEC SBC GAMMA TAX ; BETA-GAMMA CLC LDA BETA ADC #$40+$80 ; (-COS) CLC ADC GAMMA TAY ; BETA+GAMMA SEC LDA SINCOSLO+$40,X SBC SINCOSLO+$40,Y STA UNITYXLO LDA SINCOSHI+$40,X; COS(B-G) SBC SINCOSHI+$40,Y; - COS(B+G) STA UNITYXHI ; SIN(A) * SIN(B) * SIN(G) ; - COS(A) * COS(G) CLC LDA BETA ADC GAMMA SEC SBC ALPHA TAX ; BETA+GAMMA-ALPHA CLC LDA ALPHA ADC GAMMA SEC SBC BETA TAY ; ALPHA+GAMMA-BETA CLC LDA SINCOSLO+$00,X ADC SINCOSLO+$00,Y STA SINBUFL0 LDA SINCOSHI+$00,X; SIN(B+G-A) ADC SINCOSHI+$00,Y;+ SIN(A+G-B) STA SINBUFH0 CLC LDA ALPHA ADC BETA SEC SBC GAMMA TAX ; ALPHA+BETA-GAMMA CLC LDA ALPHA ADC BETA CLC ADC GAMMA TAY ; ALPHA+BETA+GAMMA SEC LDA SINCOSLO+$00,X SBC SINCOSLO+$00,Y STA SINBUFL1 LDA SINCOSHI+$00,X; SIN(A+B-G) SBC SINCOSHI+$00,Y;- SIN(A+B+G) STA SINBUFH1 CLC LDA SINBUFL0 ADC SINBUFL1 STA SINBUFL1 LDA SINBUFH0 ADC SINBUFH1 CMP #$80 ROR A ; SIN(A)*SIN(B)*SIN(G) ROR SINBUFL1 STA SINBUFH1 CLC LDA ALPHA ADC #$40+$80 ; (-COS) SEC SBC GAMMA SEC SBC #$40 ; (COS) TAX ; ALPHA-GAMMA CLC LDA ALPHA ADC #$40+$80 ; (-COS) CLC ADC GAMMA CLC ADC #$40 ; (COS) TAY ; ALPHA+GAMMA SEC LDA SINCOSLO+$40,X SBC SINCOSLO+$40,Y STA SINBUFL0 ; COS(A-G) LDA SINCOSHI+$40,X; - COS(A+G) SBC SINCOSHI+$40,Y STA SINBUFH0 ; - COS(A)*COS(G) CLC LDA SINBUFL0 ADC SINBUFL1 STA UNITYYLO LDA SINBUFH0 ADC SINBUFH1 STA UNITYYHI ; - COS(A) * SIN(B) * SIN(G) ; - SIN(A) * COS(G) CLC LDA BETA ADC GAMMA SEC SBC ALPHA SEC SBC #$40+$80 ; (-COS) TAX ; BETA+GAMMA-ALPHA CLC LDA ALPHA ADC #$40+$80 ; (-COS) CLC ADC GAMMA SEC SBC BETA TAY ; ALPHA+GAMMA-BETA CLC LDA SINCOSLO+$00,X ADC SINCOSLO+$00,Y STA SINBUFL0 LDA SINCOSHI+$00,X; SIN(B+G-A) ADC SINCOSHI+$00,Y;+ SIN(A+G-B) STA SINBUFH0 CLC LDA ALPHA ADC #$40+$80 ; (-COS) ADC BETA SEC SBC GAMMA TAX ; ALPHA+BETA-GAMMA CLC LDA ALPHA ADC #$40+$80 ; (-COS) CLC ADC BETA CLC ADC GAMMA TAY ; ALPHA+BETA+GAMMA SEC LDA SINCOSLO+$00,X SBC SINCOSLO+$00,Y STA SINBUFL1 LDA SINCOSHI+$00,X; SIN(A+B-G) SBC SINCOSHI+$00,Y;- SIN(A+B+G) STA SINBUFH1 CLC LDA SINBUFL0 ADC SINBUFL1 STA SINBUFL1 LDA SINBUFH0 ADC SINBUFH1 CMP #$80 ROR A ; - COS(A)*SIN(B)*SIN(G) ROR SINBUFL1 STA SINBUFH1 CLC LDA ALPHA ADC #$80 ; (-) SEC SBC GAMMA SEC SBC #$40 ; (COS) TAX ; ALPHA-GAMMA CLC LDA ALPHA ADC #$80 ; (-) CLC ADC GAMMA CLC ADC #$40 ; (COS) TAY ; ALPHA+GAMMA SEC LDA SINCOSLO+$40,X SBC SINCOSLO+$40,Y STA SINBUFL0 ; COS(A-G) LDA SINCOSHI+$40,X; - COS(A+G) SBC SINCOSHI+$40,Y STA SINBUFH0 ; - SIN(A)*COS(G) CLC LDA SINBUFL0 ADC SINBUFL1 STA UNITYZLO LDA SINBUFH0 ADC SINBUFH1 STA UNITYZHI ; SIN (BETA) LDX BETA LDA SINCOSLO+$00,X ASL A STA UNITZXLO LDA SINCOSHI+$00,X ROL A STA UNITZXHI ; SIN (ALPHA) * COS (BETA) SEC LDA ALPHA SBC BETA SEC SBC #$40 ; (COS) TAX ; ALPHA-BETA CLC LDA ALPHA ADC BETA CLC ADC #$40 ; (COS) TAY ; ALPHA+BETA SEC LDA SINCOSLO+$40,X SBC SINCOSLO+$40,Y STA UNITZYLO LDA SINCOSHI+$40,X; COS(A-B) SBC SINCOSHI+$40,Y; - COS(A+B) STA UNITZYHI ; - COS (ALPHA) * COS (BETA) CLC LDA ALPHA ADC #$80+$40 ; (-COS) SEC SBC BETA SEC SBC #$40 ; (COS) TAX ; ALPHA-BETA CLC LDA ALPHA ADC #$80+$40 ; (-COS) CLC ADC BETA CLC ADC #$40 ; (COS) TAY ; ALPHA+BETA CLC LDA SINCOSLO+$40,X SBC SINCOSLO+$40,Y STA UNITZZLO LDA SINCOSHI+$40,X; COS(A-B) SBC SINCOSHI+$40,Y; - COS(A+B) STA UNITZZHI ; CALCULATE NEW COORDINATES ; PRETTY UNOPTIMIZED TOO ; NEUE KOORDINATEN BERECHNEN ; AUCH ZIEMLICH UNOPTIMIERT ; P(-1;+1;+1) SEC LDA UNITXYLO SBC UNITXXLO TAX LDA UNITXYHI SBC UNITXXHI TAY CLC TXA ADC UNITXZLO STA X2DCRDFR+$00 TYA ADC UNITXZHI STA X2DCORDS+$00 SEC LDA UNITYYLO SBC UNITYXLO TAX LDA UNITYYHI SBC UNITYXHI TAY CLC TXA ADC UNITYZLO TYA ADC UNITYZHI STA Y2DCORDS+$00 SEC LDA UNITZYLO SBC UNITZXLO TAX LDA UNITZYHI SBC UNITZXHI TAY CLC TXA ADC UNITZZLO STA Z2DCRDFR+$00 TYA ADC UNITZZHI STA Z2DCORDS+$00 ; P(+1;+1;+1) CLC LDA UNITXXLO ADC UNITXYLO TAX LDA UNITXXHI ADC UNITXYHI TAY CLC TXA ADC UNITXZLO STA X2DCRDFR+$01 TYA ADC UNITXZHI STA X2DCORDS+$01 CLC LDA UNITYXLO ADC UNITYYLO TAX LDA UNITYXHI ADC UNITYYHI TAY CLC TXA ADC UNITYZLO TYA ADC UNITYZHI STA Y2DCORDS+$01 CLC LDA UNITZXLO ADC UNITZYLO TAX LDA UNITZXHI ADC UNITZYHI TAY CLC TXA ADC UNITZZLO STA Z2DCRDFR+$01 TYA ADC UNITZZHI STA Z2DCORDS+$01 ; P(-1;+1;-1) SEC LDA UNITXYLO SBC UNITXXLO TAX LDA UNITXYHI SBC UNITXXHI TAY SEC TXA SBC UNITXZLO STA X2DCRDFR+$02 TYA SBC UNITXZHI STA X2DCORDS+$02 SEC LDA UNITYYLO SBC UNITYXLO TAX LDA UNITYYHI SBC UNITYXHI TAY SEC TXA SBC UNITYZLO TYA SBC UNITYZHI STA Y2DCORDS+$02 SEC LDA UNITZYLO SBC UNITZXLO TAX LDA UNITZYHI SBC UNITZXHI TAY SEC TXA SBC UNITZZLO STA Z2DCRDFR+$02 TYA SBC UNITZZHI STA Z2DCORDS+$02 ; P(+1;+1;-1) CLC LDA UNITXXLO ADC UNITXYLO TAX LDA UNITXXHI ADC UNITXYHI TAY SEC TXA SBC UNITXZLO STA X2DCRDFR+$03 TYA SBC UNITXZHI STA X2DCORDS+$03 CLC LDA UNITYXLO ADC UNITYYLO TAX LDA UNITYXHI ADC UNITYYHI TAY SEC TXA SBC UNITYZLO TYA SBC UNITYZHI STA Y2DCORDS+$03 CLC LDA UNITZXLO ADC UNITZYLO TAX LDA UNITZXHI ADC UNITZYHI TAY SEC TXA SBC UNITZZLO STA Z2DCRDFR+$03 TYA SBC UNITZZHI STA Z2DCORDS+$03 ; P(-1;-1;+1) SEC LDA UNITXZLO SBC UNITXXLO TAX LDA UNITXZHI SBC UNITXXHI TAY SEC TXA SBC UNITXYLO STA X2DCRDFR+$04 TYA SBC UNITXYHI STA X2DCORDS+$04 SEC LDA UNITYZLO SBC UNITYXLO TAX LDA UNITYZHI SBC UNITYXHI TAY SEC TXA SBC UNITYYLO TYA SBC UNITYYHI STA Y2DCORDS+$04 SEC LDA UNITZZLO SBC UNITZXLO TAX LDA UNITZZHI SBC UNITZXHI TAY SEC TXA SBC UNITZYLO STA Z2DCRDFR+$04 TYA SBC UNITZYHI STA Z2DCORDS+$04 ; P(+1;-1;+1) SEC LDA UNITXXLO SBC UNITXYLO TAX LDA UNITXXHI SBC UNITXYHI TAY CLC TXA ADC UNITXZLO STA X2DCRDFR+$05 TYA ADC UNITXZHI STA X2DCORDS+$05 SEC LDA UNITYXLO SBC UNITYYLO TAX LDA UNITYXHI SBC UNITYYHI TAY CLC TXA ADC UNITYZLO TYA ADC UNITYZHI STA Y2DCORDS+$05 SEC LDA UNITXZLO SBC UNITZYLO TAX LDA UNITZXHI SBC UNITZYHI TAY CLC TXA ADC UNITZZLO STA Z2DCRDFR+$05 TYA ADC UNITZZHI STA Z2DCORDS+$05 ; P(-1;-1;-1) SEC LDA #$00 SBC UNITXXLO TAX LDA #$00 SBC UNITXXHI TAY SEC TXA SBC UNITXYLO TAX TYA SBC UNITXYHI TAY SEC TXA SBC UNITXZLO STA X2DCRDFR+$06 TYA SBC UNITXZHI STA X2DCORDS+$06 SEC LDA #$00 SBC UNITYXLO TAX LDA #$00 SBC UNITYXHI TAY SEC TXA SBC UNITYYLO TAX TYA SBC UNITYYHI TAY SEC TXA SBC UNITYZLO TYA SBC UNITYZHI STA Y2DCORDS+$06 SEC LDA #$00 SBC UNITZXLO TAX LDA #$00 SBC UNITZXHI TAY SEC TXA SBC UNITZYLO TAX TYA SBC UNITZYHI TAY SEC TXA SBC UNITZZLO STA Z2DCRDFR+$06 TYA SBC UNITZZHI STA Z2DCORDS+$06 ; P(+1;-1;-1) SEC LDA UNITXXLO SBC UNITXYLO TAX LDA UNITXXHI SBC UNITXYHI TAY SEC TXA SBC UNITXZLO STA X2DCRDFR+$07 TYA SBC UNITXZHI STA X2DCORDS+$07 SEC LDA UNITYXLO SBC UNITYYLO TAX LDA UNITYXHI SBC UNITYYHI TAY SEC TXA SBC UNITYZLO TYA SBC UNITYZHI STA Y2DCORDS+$07 SEC LDA UNITZXLO SBC UNITZYLO TAX LDA UNITZXHI SBC UNITZYHI TAY SEC TXA SBC UNITZZLO STA Z2DCRDFR+$07 TYA SBC UNITZZHI STA Z2DCORDS+$07 ; CONVERT COORDINATES TO 2-D ; KOORDINATEN NACH 2D WANDELN LDX #NUMPOINT-1 CONVTO2D LDY X2DCRDFR,X LDA X2DCORDS,X JSR PERSPECT STA X2DCORDS,X LDY Z2DCRDFR,X LDA Z2DCORDS,X JSR PERSPECT STA Y2DCORDS,X DEX BPL CONVTO2D ; CLEAR THE OLD POINTS ; DIE ALTEN PUNKTE LOESCHEN BIT $D011 BPL *-3 BIT $D011 BMI *-3 LDA #NUMPOINT-1 CLRPOINT PHA TAX LDA OLDXCRDS,X LDY OLDYCRDS,X TAX LDA XADDLOTB,X STA POINTERS+0 LDA XADDHITB,X STA POINTERS+1 LDA #$FF EOR PIXELTAB,X AND (POINTERS+0),Y STA (POINTERS+0),Y PLA SEC SBC #$01 BPL CLRPOINT ; PUT THE ROTATED POINTS ; DIE ROTIERTEN PUNKTE SETZEN LDA #NUMPOINT-1 PUTPOINT PHA TAX LDA X2DCORDS,X STA OLDXCRDS,X LDY Y2DCORDS,X STY OLDYCRDS,X TAX LDA XADDLOTB,X STA POINTERS+0 LDA XADDHITB,X STA POINTERS+1 LDA PIXELTAB,X ORA (POINTERS+0),Y STA (POINTERS+0),Y PLA SEC SBC #$01 BPL PUTPOINT ; ADVANCE ANGLES ; WINKEL ERHOEHEN CLC LDA #ALPHAADD ADC ALPHA STA ALPHA CLC LDA #BETAADD ADC BETA STA BETA CLC LDA #GAMMAADD ADC GAMMA STA GAMMA JMP MAINLOOP ;PERFORM PERSPECTIVE DIVISION ;PERSPEKTIVDIVISION VOLLFUEHREN PERSPECT PHA BPL NONEGCRD PHA TYA CLC EOR #$FF ADC #$01 TAY PLA EOR #$FF ADC #$00 NONEGCRD STA DIVIDEND+0 STY DIVIDEND+1 CLC LDA #$50; ONLY POSITIVE DEPTH ; VALUES ; NUR POSITIVE TIEFEN- ; WERTE ADC Y2DCORDS,X STA DIVISOR+0 LDY #$00 STY DIVISOR+1 INY STY DIVISOR+2 SEC DIVLOOP ROR DIVISOR+0 ROR DIVISOR+1 SEC LDA DIVIDEND+1 SBC DIVISOR+1 TAY LDA DIVIDEND+0 SBC DIVISOR+0 BCC *+6 STA DIVIDEND+0 STY DIVIDEND+1 ROL DIVISOR+2 BCC DIVLOOP PLA ASL A LDA DIVISOR+2 BCC *+4 EOR #$FF ADC #$40;ORIGIN IS AT ($40;$40) ;URSPRUNG BEI ($40;$40) RTS NMI RTI ; SINE/COSINE TABLE ; SINUS-/KOSINUSTABELLE *= *&$FF00+$0100 SINCOSLO .BYTE $00,$8A,$14,$9E,$28,$B1 .BYTE $3A,$C2,$4A,$D1,$58,$DE .BYTE $62,$E6,$69,$EA,$6B,$EA .BYTE $67,$E4,$5E,$D8,$4F,$C5 .BYTE $38,$AA,$1A,$88,$F4,$5E .BYTE $C6,$2B,$8E,$EE,$4D,$A8 .BYTE $01,$57,$AB,$FC,$4A,$96 .BYTE $DE,$24,$66,$A6,$E3,$1C .BYTE $53,$86,$B6,$E3,$0D,$33 .BYTE $57,$77,$93,$AD,$C3,$D5 .BYTE $E4,$F0,$F9,$FE,$FF,$FE .BYTE $F9,$F0,$E4,$D5,$C3,$AD .BYTE $93,$77,$57,$33,$0D,$E3 .BYTE $B6,$86,$53,$1C,$E3,$A6 .BYTE $66,$24,$DE,$96,$4A,$FC .BYTE $AB,$57,$01,$A8,$4D,$EE .BYTE $8E,$2B,$C6,$5E,$F4,$88 .BYTE $1A,$AA,$38,$C5,$4F,$D8 .BYTE $5E,$E4,$67,$EA,$6B,$EA .BYTE $69,$E6,$62,$DE,$58,$D1 .BYTE $4A,$C2,$3A,$B1,$28,$9E .BYTE $14,$8A,$00,$75,$EB,$61 .BYTE $D7,$4E,$C5,$3D,$B5,$2E .BYTE $A7,$21,$9D,$19,$96,$15 .BYTE $94,$15,$98,$1B,$A1,$27 .BYTE $B0,$3A,$C7,$55,$E5,$77 .BYTE $0B,$A1,$39,$D4,$71,$11 .BYTE $B2,$57,$FE,$A8,$54,$03 .BYTE $B5,$69,$21,$DB,$99,$59 .BYTE $1C,$E3,$AC,$79,$49,$1C .BYTE $F2,$CC,$A8,$88,$6C,$52 .BYTE $3C,$2A,$1B,$0F,$06,$01 .BYTE $00,$01,$06,$0F,$1B,$2A .BYTE $3C,$52,$6C,$88,$A8,$CC .BYTE $F2,$1C,$49,$79,$AC,$E3 .BYTE $1C,$59,$99,$DB,$21,$69 .BYTE $B5,$03,$54,$A8,$FE,$57 .BYTE $B2,$11,$71,$D4,$39,$A1 .BYTE $0B,$77,$E5,$55,$C7,$3A .BYTE $B0,$27,$A1,$1B,$98,$15 .BYTE $94,$15,$96,$19,$9D,$21 .BYTE $A7,$2E,$B5,$3D,$C5,$4E .BYTE $D7,$61,$EB,$75 *= *+$0100 SINCOSHI .BYTE $00,$00,$01,$01,$02,$02 .BYTE $03,$03,$04,$04,$05,$05 .BYTE $06,$06,$07,$07,$08,$08 .BYTE $09,$09,$0A,$0A,$0B,$0B .BYTE $0C,$0C,$0D,$0D,$0D,$0E .BYTE $0E,$0F,$0F,$0F,$10,$10 .BYTE $11,$11,$11,$11,$12,$12 .BYTE $12,$13,$13,$13,$13,$14 .BYTE $14,$14,$14,$14,$15,$15 .BYTE $15,$15,$15,$15,$15,$15 .BYTE $15,$15,$15,$15,$15,$15 .BYTE $15,$15,$15,$15,$15,$15 .BYTE $15,$15,$15,$15,$15,$14 .BYTE $14,$14,$14,$14,$13,$13 .BYTE $13,$13,$12,$12,$12,$11 .BYTE $11,$11,$11,$10,$10,$0F .BYTE $0F,$0F,$0E,$0E,$0D,$0D .BYTE $0D,$0C,$0C,$0B,$0B,$0A .BYTE $0A,$09,$09,$08,$08,$07 .BYTE $07,$06,$06,$05,$05,$04 .BYTE $04,$03,$03,$02,$02,$01 .BYTE $01,$00,$00,$FF,$FE,$FE .BYTE $FD,$FD,$FC,$FC,$FB,$FB .BYTE $FA,$FA,$F9,$F9,$F8,$F8 .BYTE $F7,$F7,$F6,$F6,$F5,$F5 .BYTE $F4,$F4,$F3,$F3,$F2,$F2 .BYTE $F2,$F1,$F1,$F0,$F0,$F0 .BYTE $EF,$EF,$EE,$EE,$EE,$EE .BYTE $ED,$ED,$ED,$EC,$EC,$EC .BYTE $EC,$EB,$EB,$EB,$EB,$EB .BYTE $EA,$EA,$EA,$EA,$EA,$EA .BYTE $EA,$EA,$EA,$EA,$EA,$EA .BYTE $EA,$EA,$EA,$EA,$EA,$EA .BYTE $EA,$EA,$EA,$EA,$EA,$EA .BYTE $EA,$EB,$EB,$EB,$EB,$EB .BYTE $EC,$EC,$EC,$EC,$ED,$ED .BYTE $ED,$EE,$EE,$EE,$EE,$EF .BYTE $EF,$F0,$F0,$F0,$F1,$F1 .BYTE $F2,$F2,$F2,$F3,$F3,$F4 .BYTE $F4,$F5,$F5,$F6,$F6,$F7 .BYTE $F7,$F8,$F8,$F9,$F9,$FA .BYTE $FA,$FB,$FB,$FC,$FC,$FD .BYTE $FD,$FE,$FE,$FF *= *+$0100 RETURN SEI LDA #$37 STA $01 LDX #$FF TXS JSR $FDA3 LDA #$00 TAY STA $02,Y INY BNE *-4 LDX #$3C LDY #$03 STX $B2 STY $B3 LDX #$00 LDY #$A0 JSR $FD8C JSR $FD15 JSR $FF5B JSR $E3BF LDA #$08 STA $BA JMP $9000